#include "lrcpage.h"
#include "ui_lrcpage.h"

LrcPage::LrcPage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LrcPage)
{
    ui->setupUi(this);
    //将窗口标题栏隐藏
    setWindowFlag(Qt::FramelessWindowHint);
    //设置按钮槽函数，点击按钮就隐藏这个界面
    animation = new QPropertyAnimation(this,"geometry",this);
    animation->setDuration(500);
    animation->setStartValue(QRect(10,10,width(),height()));
    animation->setEndValue(QRect(10,10+height(),width(),height()));

    connect(ui->hideBtn,&QPushButton::clicked,this,[&](){
        animation->start();         //点击关闭的时候，先进行动画效果，再关闭
    });
    connect(animation,&QPropertyAnimation::finished,this,[&](){
       hide();
    });
    //给按钮设置图片
    ui->hideBtn->setIcon(QIcon(":/images/xiala.png"));
}

LrcPage::~LrcPage()
{
    delete ui;
}

bool LrcPage::praseLrc(const QString &lrcPath)
{
    //打开文件
    LrcLines.clear();
    QFile lrcFile(lrcPath);
    if(!lrcFile.open(QFile::ReadOnly))
    {
        qDebug() << "打开文件失败: " << lrcPath;
        return false;
    }
    //通过特定的规则来读取字符串，并放入到列表中
    //[00:17.94]那些失眠的⼈啊 你们还好吗
    //[0:58.600.00]你像⼀只⻜来⻜去的蝴蝶
    while(!lrcFile.atEnd())
    {
        QString lrcWord = lrcFile.readLine(1024);
        int left = lrcWord.indexOf("[");
        int right = lrcWord.indexOf("]");

        QString timeStr = lrcWord.mid(left,right-left+1);          //获取对应的时间字符串
        //解析时间
        qint64 musicTime = 0;
        int start = 1;
        //解析分钟以 : 来解析
        int end = timeStr.indexOf(":",start);
        musicTime += timeStr.mid(start,end-start).toInt() * 60 * 1000;      //这里的基础单位是毫秒
        //解析秒以 . 来解析
        start = end + 1;
        end = timeStr.indexOf(".",start);
        musicTime += timeStr.mid(start,end-start).toInt() * 1000;
        //解析毫秒
        start = end + 1;
        end = timeStr.indexOf(".",start);
        musicTime += timeStr.mid(start,end-start).toInt();
        //解析歌词
        QString word = lrcWord.mid(right+1).trimmed();
        LrcLines.push_back(LrcLine(musicTime,word));
    }
    //测试验证是否解析成功
    for(auto& it : LrcLines)
    {
        qDebug() << it.time << " " << it.text;
    }
    return true;
}

int LrcPage::getLineWordIndex(qint64 pos)
{
    //通过时间来获取歌词数据的下标
    if(LrcLines.isEmpty())
    {
        return -1;      //没有歌词数据
    }
    if(LrcLines[0].time > pos) return 0;    //第一个歌词数据
    //如果在两句歌词之间，取前面那个
    for(int i = 1;i<LrcLines.size();++i)
    {
        if(LrcLines[i-1].time < pos && pos <= LrcLines[i].time)
        {
            return i-1;
        }
    }
    //这里应该是最大的，返回最后一个数据的下标
    return LrcLines.size()-1;
}

QString LrcPage::getLrcWord(int index)
{
    if(index < 0  || index >= LrcLines.size()) return "";       //这里用来处理歌词开始以及结束前后面没有歌词的情况
    return LrcLines[index].text;
}

void LrcPage::showLrcWord(qint64 time)
{
    //根据时间来获取坐标
    int index = getLineWordIndex(time);
    //根据当前坐标，来渲染全部的歌词
    if(index == -1)
    {
        //这里没有歌词，直接赋值空即可
        ui->line1->setText("");
        ui->line2->setText("");
        ui->line3->setText("");
        ui->lineCenter->setText("当前歌曲无歌词");
        ui->line4->setText("");
        ui->line5->setText("");
        ui->line6->setText("");
    }
    else
    {
        ui->line1->setText(getLrcWord(index-3));
        ui->line2->setText(getLrcWord(index-2));
        ui->line3->setText(getLrcWord(index-1));
        ui->lineCenter->setText(getLrcWord(index));
        ui->line4->setText(getLrcWord(index+1));
        ui->line5->setText(getLrcWord(index+2));
        ui->line6->setText(getLrcWord(index+3));
    }
}

void LrcPage::showLrcTopInfo(const QString &singer, const QString &musicName)
{
    ui->musicName->setText(musicName);
    ui->musicSinger->setText(singer);
}
